/***************************************************************************
 创建者: 华磊
 开始时间: 2018.8.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) 李文友 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:
 *
 *                                                                         *
 ***************************************************************************/
#ifndef ECATTYPE_H
#define ECATTYPE_H

#include <QString>
#include <QVector>
//#include "ecatconfig.h"
#include "globalDefine.h"

//my
typedef char  s8;
typedef short s16;
typedef int   s32;
typedef long long s64;

typedef unsigned char  u8;
typedef unsigned short u16;
typedef unsigned int   u32;
typedef unsigned long long u64;



/// 警告宏定义
#define D_WARM_RST_PFAIL (0x01)      //主电源缺相
#define D_WARM_LOW_BATT (0x02)     //电池电量不足
#define D_WARM_OV_TCMD (0x04)      //扭矩指令过大
#define D_WARM_OV_VCMD (0x08)      //速度指令过大
#define D_WARM_OV_LOAD (0X10)      //超载警告
#define D_WARM_SETUP (0x20)           //选定容量
#define D_WARM_UD_VTG (0x40)       //低电压警告
#define D_WARM_EMG (0x80)            //EMG警告




/**
 * @brief The E_MOTOR_CMD enum  伺服状态/控制
 */
enum E_MOTOR_CMD
{
    eServoOff,
    eServoSwitchOn,
    eServoEnable,
    eServoDisable,
    eServoQuickStop,
    eServoFaultReset,
    eServoHalt,
    eServoHaltReset,
};

/**
 * @brief The E_SERVO_CONTROLL_MODE enum 伺服控制模式/控制
 */
enum E_SERVO_CONTROLL_MODE
{
    eServoModeNoMode = 0,
    eServoModePp = 1,//pp
    eServoModePv = 3,
    eServoModeTq = 4,
    eServoModeHm = 6,//归零模式
    eServoModeIp = 7,
    eServoModeCsp = 8,//同步位置控制
    eServoModeCsv = 9,//同步速度控制
    eServoModeCst = 10,//同步扭矩控制
};

/**
 * @brief The E_ECAT_SLAVE_STATE enum 从站状态
 */
enum E_ECAT_SLAVE_STATE
{
    eSlaveErr=-1,//error_flag
    eSlaveUnknown=0x0,
    eSlaveInit=0x01,
    eSlavePreOP=0x02,
    eSlaveSafeOP=0x04,
    eSlaveOP =0x08,
    eSlaveBootstrap=0x03,
};

/**
 * @brief The E_ECAT_MASTER_STATE enum 主站状态/控制
 */
enum E_ECAT_MASTER_STATE
{
    eMasterErr_LOCK,
    eMasterErr,
    eMasterBootstrap,
    eMasterUnknown,
    eMasterInit,
    eMasterPreOP,
    eMasterSafeOP,
    eMasterOP,
    eMasterSleep,
};

/**
 * @brief The E_EcatDevType enum 设备类型标识
 */
enum E_EcatDevType
{
    E_EcatDev_TypeErr=-1,//错误,无效，无法识别,不可用状态
    E_EcatDev_New,//新增,未分类
    E_EcatDev_NotUsed,//
    E_EcatDev_Used,//

    E_EcatDev_Servo,//
    E_EcatDev_IoModule,//
    E_EcatDev_Coupler,//耦合器
    E_EcatDev_rfidSensor,//rfid读卡器
    E_EcatDev_maganeticSensor,//磁传感器
    E_EcatDev_batterySensor,//电池
    E_EcatDev_EncoderReceiver,//编码器接收模块


};



//struct Message{

//};

///**
// * @brief The MSG_LEVEL_TYPE enum //消息级别
// */
//enum MSG_LEVEL_TYPE
//{
//    ENUM_MSG_ERROR,//错误
//    ENUM_MSG_WARNING,//警告
//    ENUM_MSG_REMIND,//提示
//    ENUM_MSG_LOG,//log
//    ENUM_MSG_END
//};


///获取单个轴伺服 状态
struct  ServoState
{
    bool isServoOn;//( int nd );//伺服使能
    bool isServoQuickStop;//( int nd );//立即停止
    bool isServoPowerOn;//( int nd );//伺服主电源
    bool isServoTargetReached;//( int nd );//目标位置到达// only for csp mode
    bool isServoFllowingError;//( int nd );//跟随误差报警发生// only for csp mode
    bool isServoHoming;//( int nd );//回零中//only for home mode
    bool isServoHomingOk;//( int nd );//回零中//only for home mode
    bool isServoHomingErr;//( int nd );//回零中//only for home mode

    int position;//位置
    int speed;//速度
    int torque;//力矩
    int power;//功率
    int fllowingOffset;//实际跟随误差(计算值)

    int homeOffset;//写回零偏差

    int errorCode;//报警
    int warnCode;//警告
    QString errorString;
    QString warnString;
};


/**
 * @brief The EcatBusDevInfo struct 总线设备信息
 */
struct EcatBusDevInfo
{
    QString devName;//设备名称
    unsigned int node;//所在通信节点
    unsigned int alias;//别名
    unsigned int vendorId;//厂商ID
    unsigned int productCode;//产品码
    unsigned int revisionNumber;//修订版本号(预留)
    unsigned char  state;//状态：(预留)
    int devType;//设备类型(E_EcatDevType)
    QString mappingObjectFile;//对象字典配置文件
};


//#ifdef D_USE_IGH
#include <ecrt.h>//很难去掉
/**
 * @brief The EcatObjectConfig struct /// ethercat配置保存
 */
struct EcatObjectConfig{
    QVector<ec_pdo_entry_info_t> ec_entries;//pdo入口
    QVector<ec_pdo_info_t> ec_pdos;//pdo
    QVector<ec_sync_info_t> ec_syncs;//同步管理
};
////#endif

/**
 * @brief The S_EcatDevInfo struct ///设备节点配置信息
 */
struct S_EcatDevInfo{
    EcatBusDevInfo devInfo;//节点信息
//#ifdef D_USE_IGH
    EcatObjectConfig objConfig;//对象字典
//#endif
};

//hualei
enum E_DEVICE_PROTOCOL
{
    E_DEVICE_PROTOCOL_ETHERCAT=1,
    E_DEVICE_PROTOCOL_MODBUS_RTU=2,
    E_DEVICE_PROTOCOL_MODBUS_TCP=3,
    E_DEVICE_PROTOCOL_CANOPEN=4
};



typedef struct{
    int robotId;//机器人ID
    QString robotName;//机器人名字
    QString robotFolder;//机器人文件夹名
    QString robotSetting;//配置文件名
    QString ioMapXML;//io映射文件名

    int robotMotorCount;//机器人自身轴数
    int extMotorCount;//外部轴数

    int doCount;//DO总数，预留
    int diCount;//DI总数 ， 预留
    QVector<int> motorAlias;//其下的motor设备站点别名
    QVector<int> motorChannel;
    QVector<E_DEVICE_PROTOCOL> motorDeviceProtocol;
    QVector<E_MOTOR_CONTROL_MODE> motorControlMode;
    QVector<int> ethercat_ioAlias;//其下的ethercat io设备站点
    QVector<int> modbus_rtu_ioAlias;//其下的modbus_rtu io设备站点,不支持多根mobus_rtu总线
    QVector<int> modbus_tcp_ioAlias;//其下的modbus_tcp io设备站点
    QVector<int> canopen_ioAlias;//其下的canopen io设备站点


    std::string robotSpecification;	//机器人规格/ 厂商产品型号
    int robotType;					//机器人类型/ 分类(跟算法的那個不一样，仿真要用到)
    std::string robotFileAddress;	//机器人所在的文件路径
    std::string robotPictureAddress;//机器人所在的图片路径+名字(xml文件只保存名字，读出来后会补全)
}RobotInfo;


///通过站号直接获 取机器人ID和轴号 devType 设备类型
struct SRobotIdAndAxit
{
    int robotId;//机器人ID
    int axis;//轴号/io模块号  (当设备类型为io时，对应io模块号)  (io模块多个机器人公用时，无法处理关系 机器人ID和轴号)
    int devType;// 设备类型 E_EcatDevType,  2017.5.31.xyf.add
};


//enum E_DRIVER_TYPE
//{
//    E_DRIVER_TYPE_ETHERCAT=0,
//    E_DRIVER_TYPE_MODBUS_RTU=1,

//};//是否补充不同厂家，不同协议的产品

//enum E_IO_MODULE_TYPE
//{
//    E_IO_MODULE_TYPE_ETHERCAT=0,
//    E_IO_MODULE_TYPE_MODBUS_TCP=1,
//    E_IO_MODULE_TYPE_MODBUS_RTU=2,

//};//是否补充不同厂家，不同协议的产品




#endif // ECATTYPE_H
